package equals_;

public class Equals01 {
    public static void main(String[] args) {
        //==如果判断引用类型，判断的是地址是否相等，
        // 即判定是不是同一个对象
        A a = new A();//a指向一个具体的A对象
        A b = a;//让b指向a,即a和b都指向具体的一个对象A
        A c = b;//让c指向b
        System.out.println(a == c);//true
        //a,c都是引用类型，==本质上是判断它们是否指向同一个对象
        System.out.println(b == c);//true
        B bobj = a;//父类的引用指向子类的一个对象
        System.out.println(bobj == a);//true
        //bobj和a指向的是同一块空间

        int num1 = 10;
        double num2 = 10.0;
        //==还可以判断基本数据类型，判断值是否相等
        System.out.println(num1 == num2);//true

        //equals默认判断的是地址是否相等，子类中往往重写该方法用于判断内容是否相等
        //子类指String类
       "hello".equals("abc");
       //"hello"这个对象在调用方法，传进去的参数是"abc"

       /*
       public boolean equals(Object anObject) {
       //this表示调用方法的对象.
        if (this == anObject) {//调用方法的对象是否和传进来的参数（对象）是同一个对象相等
            return true;
        }
        if (anObject instanceof String) {//判断传进来的对象是不是String类型或String类型的子类
            String anotherString = (String)anObject;//将父类的引用强转成String类型
            int n = value.length;
            //value是调用equals这个方法的对象的值
            if (n == anotherString.value.length) {//如果长度相等
            //就转成char数组
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {//循环，一个字节一个字节地比较
                    if (v1[i] != v2[i])//期间只要有一个字符不相等，就退出循环，返回false
                        return false;
                    i++;
                }
                return true;//如果两个字符串的所有字符都相等，则返回true
            }
        }
        return false;//如果比较的不是字符串，则直接返回false
    }
       * */

        //Object中的equals
    /*
    public boolean equals(Object obj){
    return (this == obj)//this指调用该方法的对象
    //如果是两个引用类型，== 判断是否为同一个对象或指向的是否为同一块空间
    }
    //equals默认判断的是地址是否相等
     */

        Integer integer1 = new Integer(5);
        Integer integer2 = new Integer(5);
        //两个引用类型，==判断是否指向同一块空间
        System.out.println(integer1 == integer2);//false
        //两个不同的对象，指向两块不同的空间，只不过空间里存放的数据相同

        //Integer和String中equals判断的是内容是否相等
        System.out.println(integer1.equals (integer2));//true

        String str1 = new String("hspedu");
        String str2 = new String("hspedu");
        System.out.println(str1 == str2);//false,两个不同的对象
        System.out.println(str1.equals(str2));//true,内容相等

    }
}
class B{}
class A extends B{

}
